#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行，
# 第2行注释表示.py文件本身使用标准UTF-8编码：
print('#############错误处理，使用错误码来表示，非常的不方便#############')
# 所以高级语言通常都内置了一套try...except...finally...的错误处理机制，Python也不例外。
try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')
# 可以定义多个异常
print('#############可以定义多个异常#############')
try:
    print('try...')
    r = 10 / int('a')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
finally:
    print('finally...')
print('END')
# 此外，如果没有错误发生，可以在except语句块后面加一个else，当没有错误发生时，会自动执行else语句：
print(
    '#############此外，如果没有错误发生，可以在except语句块后面加一个else，当没有错误发生时，会自动执行else语句#############')
try:
    print('try...')
    r = 10 / int('2')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError:', e)
else:
    print('no error!')
finally:
    print('finally...')
print('END')
# Python的错误其实也是class，所有的错误类型都继承自BaseException，所以在使用except时需要注意的是，
# 它不但捕获该类型的错误，还把其子类也“一网打尽”。
# 不需要在每个可能出错的地方去捕获错误，只要在合适的层次去捕获错误就可以了
try:
    foo()
except BaseException as e:
    print("baseExcetpion!", e.args)


# 发生异常自动会抛给外层的方法
def foo(s):
    return 10 / int(s)


def bar(s):
    return foo(s) * 2


def main(s):
    try:
        bar(s)
    except Exception as e:
        print("error")


main(0)
print('#############调用栈：如果异常没有被捕获，则会一直往上抛#############')
